#include "vtor_i2c.h"

// 加入用户工程宏
#ifdef __DEMO_PROJECT__
#include "main.h"

// 加入需要依赖的变量
#define	VTOR_I2C_SCL_Port		GPIOB
#define VTOR_I2C_SCL_Pin		GPIO_PIN_13
#define	VTOR_I2C_SDA_Port		GPIOB
#define VTOR_I2C_SDA_Pin		GPIO_PIN_14


VtorI2c vtorI2cArray[3] = {0};
VtorI2c* qmcVtorI2c = NULL;
VtorI2c* masterI2c = NULL;
VtorI2c* oledI2c = NULL;


void VtorI2c_WriteScl(VtorI2c* i2c, uint8_t level)
{
	if(i2c == qmcVtorI2c)
	{
		HAL_GPIO_WritePin(VTOR_I2C_SCL_Port, VTOR_I2C_SCL_Pin, (GPIO_PinState)level);
	}
	else if(i2c == masterI2c)
	{
		HAL_GPIO_WritePin(I2C_MASTER_SCL_GPIO_Port, I2C_MASTER_SCL_Pin, level);
	}
}

void VtorI2c_WriteSda(VtorI2c* i2c, uint8_t level)
{
	if(i2c == qmcVtorI2c)
	{
		HAL_GPIO_WritePin(VTOR_I2C_SDA_Port, VTOR_I2C_SDA_Pin, (GPIO_PinState)level);
	}
	else if(i2c == masterI2c)
	{
		HAL_GPIO_WritePin(I2C_MASTER_SDA_GPIO_Port, I2C_MASTER_SDA_Pin, level);
	}
}

uint8_t VtorI2c_ReadScl(VtorI2c* i2c)
{
	if(i2c == qmcVtorI2c)
	{
		return HAL_GPIO_ReadPin(VTOR_I2C_SCL_Port, VTOR_I2C_SCL_Pin);;
	}
	else if(i2c == masterI2c)
	{
		return HAL_GPIO_ReadPin(I2C_MASTER_SCL_GPIO_Port, I2C_MASTER_SCL_Pin);
	}
}

uint8_t VtorI2c_ReadSda(VtorI2c* i2c)
{
	if(i2c == qmcVtorI2c)
	{
		return HAL_GPIO_ReadPin(VTOR_I2C_SDA_Port, VTOR_I2C_SDA_Pin);;
	}
	else if(i2c == masterI2c)
	{
		return HAL_GPIO_ReadPin(I2C_MASTER_SDA_GPIO_Port, I2C_MASTER_SDA_Pin);
	}
}

void VtorI2c_SetSdaDir(VtorI2c* i2c, uint8_t dir)
{
	if(i2c == qmcVtorI2c)
	{
		GPIO_InitTypeDef GPIO_InitStruct = {0};
		GPIO_InitStruct.Pin = VTOR_I2C_SDA_Pin;
		if(dir == GPIO_DIR_OUTPUT)
		{
			GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
		}
		else
		{
			GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		}
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
		HAL_GPIO_Init(VTOR_I2C_SDA_Port, &GPIO_InitStruct);
	}
	else if(i2c == masterI2c)
	{
		GPIO_InitTypeDef GPIO_InitStruct = {0};
		GPIO_InitStruct.Pin = I2C_MASTER_SDA_Pin;
		if(dir == GPIO_DIR_OUTPUT)
		{
			// 如果都没有上拉电阻，记得将sda设置成推挽输出
			GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		}
		else
		{
			GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		}
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
		HAL_GPIO_Init(I2C_MASTER_SDA_GPIO_Port, &GPIO_InitStruct);
	}
}


// 初始化IIC的IO口 给函数指针赋值
void VtorI2c_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	/*Configure GPIO pins : PBPin PBPin PBPin */
	GPIO_InitStruct.Pin = VTOR_I2C_SCL_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(VTOR_I2C_SCL_Port, &GPIO_InitStruct);

	/*Configure GPIO pins : PBPin PBPin PBPin */
	GPIO_InitStruct.Pin = VTOR_I2C_SDA_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 如果都没有上拉电阻，记得将sda设置成推挽输出
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(VTOR_I2C_SDA_Port, &GPIO_InitStruct);

	qmcVtorI2c = &vtorI2cArray[0];
	mpu6050VtorI2c = &vtorI2cArray[0];
	oledI2c = &vtorI2cArray[0];


    VtorI2c_SetSdaDir(mpu6050VtorI2c, GPIO_DIR_OUTPUT);
    VtorI2c_Stop(mpu6050VtorI2c);
	// 测试主机
    VtorI2c_SetSdaDir(masterI2c, GPIO_DIR_OUTPUT);
    VtorI2c_Stop(masterI2c);
}


inline void VtorI2c_Delay(uint32_t tick)
{

	//HAL_Delay(1);

	__NOP();
	__NOP();
	__NOP();
	__NOP();
}


#endif

